package com.southwind.controller;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.southwind.entity.Back;
import com.southwind.entity.Book;
import com.southwind.entity.Borrow;
import com.southwind.entity.Sort;
import com.southwind.service.BackService;
import com.southwind.service.BookService;
import com.southwind.service.BorrowService;
import com.southwind.service.SortService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.stereotype.Controller;

import java.util.List;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 */
/**
 * <p>
 * 分类管理前端控制器，负责处理与图书分类相关的增删查改操作。
 * </p>
 *
 */

@Controller
@RequestMapping("/sort")
public class SortController {

    /**
     * 自动注入SortService，用于处理分类数据的业务逻辑。
     */

    @Autowired
    private SortService sortService;
    /**
     * 自动注入BookService，用于处理书籍数据的业务逻辑。
     */

    @Autowired
    private BookService bookService;
    /**
     * 自动注入BorrowService，用于处理借阅数据的业务逻辑。
     */

    @Autowired
    private BorrowService borrowService;
    /**
     * 自动注入BackService，用于处理归还数据的业务逻辑。
     */
    @Autowired
    private BackService backService;

    /**
     * 显示所有分类列表。
     * <p>
     * 将分类列表数据传递给视图，用于展示。
     *
     * @param model Spring MVC模型对象，用于传递数据到视图
     * @return 视图名称，跳转到添加书籍页面
     */

    @GetMapping("/list")
    public String list(Model model){
        model.addAttribute("list", this.sortService.list());
        return "sysadmin/addBook";
    }
    /**
     * 搜索分类。
     * <p>
     * 根据分类名称模糊搜索分类，并将结果传递给视图。
     *
     * @param name 分类名称关键字
     * @param model Spring MVC模型对象，用于传递数据到视图
     * @return 视图名称，跳转到分类列表页面
     */
    @PostMapping("/search")
    public String search(String name,Model model){
        QueryWrapper<Sort> queryWrapper = new QueryWrapper<>();
        queryWrapper.like(StringUtils.isNotBlank(name), "name", name);
        List<Sort> list = this.sortService.list(queryWrapper);
        model.addAttribute("list", list);
        return "/sysadmin/sort";
    }
    /**
     * 添加分类。
     * <p>
     * 接收分类实体对象，保存到数据库。
     *
     * @param sort 分类实体对象
     * @return 重定向到分类列表页面的URL
     */

    @PostMapping("/add")
    public String add(Sort sort){
        this.sortService.save(sort);
        return "redirect:/sysadmin/sortList";
    }
    /**
     * 根据ID查找分类信息。
     * <p>
     * 用于更新分类前回显分类信息。
     *
     * @param id 分类ID
     * @param model Spring MVC模型对象，用于传递数据到视图
     * @return 视图名称，跳转到更新分类页面
     */

    @GetMapping("/findById/{id}")
    public String findById(@PathVariable("id") Integer id,Model model){
        Sort sort = this.sortService.getById(id);
        model.addAttribute("sort", sort);
        return "/sysadmin/updateSort";
    }
    /**
     * 更新分类信息。
     * <p>
     * 根据分类实体对象更新数据库中的分类信息。
     *
     * @param sort 分类实体对象
     * @return 重定向到分类列表页面的URL
     */

    @PostMapping("/update")
    public String update(Sort sort){
        this.sortService.updateById(sort);
        return "redirect:/sysadmin/sortList";
    }
    /**
     * 删除分类。
     * <p>
     * 删除指定ID的分类，同时级联删除属于该分类的所有书籍及其借阅和归还记录。
     *
     * @param id 分类ID
     * @return 重定向到分类列表页面的URL
     */

    @GetMapping("/delete/{id}")
    public String delete(@PathVariable("id") Integer id){
        // 查询属于该分类的所有书籍
        QueryWrapper<Book> bookQueryWrapper = new QueryWrapper<>();
        bookQueryWrapper.eq("sid", id);
        List<Book> bookList = this.bookService.list(bookQueryWrapper);

        // 遍历书籍，删除相关借阅和归还记录，最后删除书籍
        for (Book book : bookList) {
            QueryWrapper<Borrow> borrowQueryWrapper = new QueryWrapper<>();
            borrowQueryWrapper.eq("bid", book.getId());
            List<Borrow> borrowList = this.borrowService.list(borrowQueryWrapper);
            // 删除借阅记录关联的归还记录
            for (Borrow borrow : borrowList) {
                QueryWrapper<Back> queryWrapper = new QueryWrapper<>();
                queryWrapper.eq("brid", borrow.getId());
                this.backService.remove(queryWrapper);
                this.borrowService.removeById(borrow.getId());
            }
            // 删除书籍
            this.bookService.removeById(book.getId());
        }
        // 最后删除分类
        this.sortService.removeById(id);
        return "redirect:/sysadmin/sortList";
    }
}

